package com.guanyu.u2cache.annotation;

import com.guanyu.u2cache.enums.CacheType;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * @author zhouyunjian
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
//@Cacheable //todo可用缓存则会默认使用Cacheable方式标记并覆盖，自定义方式未进来
public @interface U2Cacheable {
    //  @AliasFor(annotation = Cacheable.class, attribute = "value")
    //String[] value() default {};


    //@AliasFor(annotation = Cacheable.class, attribute = "cacheNames")
    String[] cacheNames() default {"localRemoteCache"};

    // @AliasFor(annotation = Cacheable.class, attribute = "key")
    String key() default "#root.methodName";

    /**
     * 缓存事件:
     * 缓存事件绑定缓存名，多对多关系，缓存事件清空则缓存名清除
     *
     * @return
     */
    String[] listenEventName() default "";

    /**
     * 缓存策略：
     * CacheType.LEVEL1CACHE-一级缓存/本地缓存
     * CacheType.LEVEL2CACHE-二级缓存/远程缓存
     * CacheType.LEVEL1TOL2CACHE-一级+二级缓存
     *
     * @return
     */
    CacheType cacheType() default CacheType.LEVEL1TO2;

    /**
     * 超时时间参数: 正数值，如果<=0则不限制超时
     *
     * @return
     */
    long expireTime() default 0;

    /**
     * 超时时间单位
     * 时间支持：天/时/分/秒
     *
     * @return
     */
    TimeUnit expireUnit() default TimeUnit.MINUTES;

    /**
     * 缓存续命
     * 缓存到期前进行重加载处理，不断进行缓存续命
     *
     * @return
     */
    boolean continueLife() default false;

    /**
     * 缓存预热
     * 服务启动阶段进行缓存预热处理
     *
     * @return
     */
    boolean preHeat() default false;

}
